#ifndef MAIN_H__
#define MAIN_H__
#include <bits/stdc++.h>
using namespace std;

const int n = 200;              // 地图大小
const int robot_num = 10;       // 机器人数量
const int berth_num = 10;       // 泊位数量
const int boat_num = 5;         // 船数量
const int N = 210;
const int frame_num = 15000;    // 总帧数
const int frame_deviation = 1; // 帧误差，可以增加容错率
const int max_astar = 15;	// 限制1帧内a*的调用次数
const int avoid_range = 3;

// 机器人移动方向枚举
enum
{
    M_RIGHT = 0,
    M_LEFT,
    M_UP,
    M_DOWN
};

// 坐标
struct Point
{
    int x, y;
    Point() {}
    Point(int _x, int _y) : x(_x), y(_y) {}
    bool operator==(const Point& p) const {
        return (x == p.x && y == p.y);
    }
};

// 商品
struct Goods
{
    Point p;           // 商品坐标
    int price;         // 商品价格
    int survival_time; // survival_time帧时该物体消失
    int goods_status;  // 0表示商品已经消失，1表示商品未消失
    Goods() : goods_status(1) {}
    Goods(int x, int y, int price, int survival_time) : price(price), survival_time(survival_time), goods_status(1)
    {
        p.x = x;
        p.y = y;
    }
};

// 泊位
struct Berth
{
    Point p;            // 泊位的左上角坐标
    int transport_time; // 产生价值的时间，单位为帧（0~1000）
    int loading_speed;  // 泊位的装载速度，即每帧可以装载的物品数（1~5）
    int status;         // 0表示没有船要停，1表示有船要停,2表示有两艘船
    list<int> boat_ids;		// 要停到泊位上的船的id
    int robot_num;      // 要到泊位来的机器人数量
    int goods_price;    // 泊位上商品总价值
    int goods_num;		// 泊位上的商品数
    int goods_index;
    int wait_time;		// 没有机器人送货到该泊位上的等待时间
    list<int> goods_price_list; // 泊位上的商品price链表
    
    double worth;		// 泊位价值
    Berth() {}
    Berth(int x, int y, int transport_time, int loading_speed)
    {
        p.x = x;
        p.y = y;
        this->transport_time = transport_time;
        this->loading_speed = loading_speed;
    }
};


struct hash_fn
{
    size_t operator() (const Point& p) const {
    	size_t hash1 = hash<int>()(7);
        size_t h1 = hash<int>()(p.x);
        size_t h2 = hash<int>()(p.y);
        hash1 = 71 * hash1 + h1;
    	hash1 = 71 * hash1 + h2;
        
        return hash1;
    }
};

extern int boat_capacity;   // 船的容积，最多能装的物品数（1~1000）
extern char ch_map[N][N];   // 字符地图，200x200
extern int gds_map[n][n];   // 商品地图
extern int frame_id;        // 当前帧序号
extern int money;           // 当前金钱数
extern Berth berth[berth_num]; // 泊位信息
extern vector<int> worth_berth;
extern unordered_map<Point, int, hash_fn> p_map; // 记录机器人的坐标
extern vector<Goods> goods_list; // 当前地图上的商品
extern int maps; // 记录地图，1为大图，2为迷宫图

extern int max_transport_time;
extern int min_transport_time; // 场上泊位的最小运输时间
extern int min_time_berthid; // 运货时间最短的泊位id

extern int crack_times;
extern int missing_frame;
extern int get_goods_sum;
extern int get_goods_prices;

// 机器人指令定义
inline void move(int rbt_id, int dir) { printf("move %d %d\n", rbt_id, dir); }
inline void get(int rbt_id) { printf("get %d\n", rbt_id); }
inline void pull(int rbt_id) { printf("pull %d\n", rbt_id); }

// 船舶指令定义
inline void ship(int boat_id, int berth_id) { printf("ship %d %d\n", boat_id, berth_id); }
inline void go(int boat_id) { printf("go %d\n", boat_id); }

// 获取方向
inline int getDirect(const Point& start, const Point& end)
{
    int x_n = end.x - start.x;
    int y_n = end.y - start.y;

    if (x_n == 0 && y_n == 1)
        return M_RIGHT;
    if (x_n == 0 && y_n == -1)
        return M_LEFT;
    if (x_n == -1 && y_n == 0)
        return M_UP;
    if (x_n == 1 && y_n == 0)
        return M_DOWN;
    if (x_n == 0 && y_n == 0)
		return 8;
    return -1;
}

#endif
